package gutil

import (
	"strconv"
	"strings"
)

// 比较版本号，返回 1 表示 v1 > v2，-1 表示 v1 < v2，0 表示相等
func CompareVersions(v1, v2 string) int {
	// 移除版本号前缀 "v" 或 "V" 如果存在
	v1 = strings.TrimPrefix(strings.TrimPrefix(v1, "v"), "V")
	v2 = strings.TrimPrefix(strings.TrimPrefix(v2, "v"), "V")

	// 处理空字符串情况
	if v1 == "" && v2 == "" {
		return 0
	}
	if v1 == "" {
		return -1
	}
	if v2 == "" {
		return 1
	}

	parts1 := strings.Split(v1, ".")
	parts2 := strings.Split(v2, ".")

	// 直接比较，不需要预先补齐数组
	maxLen := len(parts1)
	if len(parts2) > maxLen {
		maxLen = len(parts2)
	}

	for i := 0; i < maxLen; i++ {
		var num1, num2 int
		var err1, err2 error

		// 获取版本号段，如果超出范围则默认为0
		if i < len(parts1) {
			num1, err1 = strconv.Atoi(strings.TrimSpace(parts1[i]))
			if err1 != nil {
				num1 = 0 // 非数字部分视为0
			}
		}

		if i < len(parts2) {
			num2, err2 = strconv.Atoi(strings.TrimSpace(parts2[i]))
			if err2 != nil {
				num2 = 0 // 非数字部分视为0
			}
		}

		if num1 > num2 {
			return 1
		} else if num1 < num2 {
			return -1
		}
	}

	return 0
}
